﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.IO;

namespace ZhangZhao.Common
{
    public class ImageHelper
    {
        /// <summary>
        /// 生成缩略图
        /// </summary>
        /// <param name="originalImagePath">源图路径（物理路径）</param>
        /// <param name="thumbnailPath">缩略图路径（物理路径）</param>
        /// <param name="width">缩略图宽度</param>
        /// <param name="height">缩略图高度</param>
        /// <param name="mode">生成缩略图的方式</param>    
        public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
        {
            System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);

            int towidth = width;
            int toheight = height;

            int x = 0;
            int y = 0;
            int ow = originalImage.Width;
            int oh = originalImage.Height;

            switch (mode)
            {
                case "HW"://指定高宽缩放（可能变形）                
                    break;
                case "W"://指定宽，高按比例                    
                    toheight = originalImage.Height * width / originalImage.Width;
                    break;
                case "H"://指定高，宽按比例
                    towidth = originalImage.Width * height / originalImage.Height;
                    break;
                case "Cut"://指定高宽裁减（不变形）                
                    if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
                    {
                        oh = originalImage.Height;
                        ow = originalImage.Height * towidth / toheight;
                        y = 0;
                        x = (originalImage.Width - ow) / 2;
                    }
                    else
                    {
                        ow = originalImage.Width;
                        oh = originalImage.Width * height / towidth;
                        x = 0;
                        y = (originalImage.Height - oh) / 2;
                    }
                    break;
                default:
                    break;
            }

            //新建一个bmp图片
            System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);

            //新建一个画板
            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);

            //设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

            //设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            //清空画布并以透明背景色填充
            g.Clear(System.Drawing.Color.Transparent);

            //在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight),
                new System.Drawing.Rectangle(x, y, ow, oh),
                System.Drawing.GraphicsUnit.Pixel);

            try
            {
                //以jpg格式保存缩略图
                bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch (System.Exception e)
            {
                throw e;
            }
            finally
            {
                originalImage.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }
        }

        ///originalImage:原始的图像
        ///thumbnailPath:目标图像的路径
        ///DestSize:目标大小
        public static byte[] MakeThumbnail(Image originalImage, string thumbnailPath, Size DestSize)
        {
            Size size = GetLogoImageActualDesiredSize(originalImage.Size, DestSize);

            int towidth = size.Width;
            int toheight = size.Height;

            int x = 0;
            int y = 0;
            int ow = originalImage.Width;
            int oh = originalImage.Height;

            //create a new bmp picutre object
            Image bitmap = new System.Drawing.Bitmap(towidth, toheight);

            //create a new graphics
            Graphics g = System.Drawing.Graphics.FromImage(bitmap);

            //set interpolation way of high quality
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

            //set smooothing mode of high quality
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            g.Clear(Color.Transparent);

            g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
                            new Rectangle(x, y, ow, oh),
                            GraphicsUnit.Pixel);
            try
            {
                FileStream fs = new FileStream(thumbnailPath, FileMode.Create);
                bitmap.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
                fs.Close();
                MemoryStream ms = new MemoryStream();
                bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] byteArray = ms.ToArray();
                ms.Close();
                return byteArray;
            }
            catch (System.Exception e)
            {
                throw e;
            }
            finally
            {
                originalImage.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }
        }

        public static Size GetLogoImageActualDesiredSize(Size originLogoSize, Size desiredLogoSize)
        {
            if (originLogoSize.Width <= 0 || originLogoSize.Height <= 0)
                throw new ArgumentOutOfRangeException("originLogoSize", "Width or Height of size is smaller or equal to zero");
            if (desiredLogoSize.Width <= 0 || desiredLogoSize.Height <= 0)
                throw new ArgumentOutOfRangeException("desiredLogoSize", "Width or Height of size is smaller or equal to zero");

            float scaleX = (float)desiredLogoSize.Width / originLogoSize.Width;
            float scaleY = (float)desiredLogoSize.Height / originLogoSize.Height;
            float scale = Math.Min(scaleX, scaleY);
            int width = Convert.ToInt32(Math.Truncate(originLogoSize.Width * scale));
            int height = Convert.ToInt32(Math.Truncate(originLogoSize.Height * scale));
            return new Size(width, height);
        }

        //   按模版比例生成缩略图（以流的方式获取源文件）   
        //生成缩略图函数   
        //顺序参数：源图文件流、缩略图存放地址、模版宽、模版高   
        //注：缩略图大小控制在模版区域内   
        public static void MakeSmallImg(string fromFileStream, string fileSaveUrl, System.Double templateWidth, System.Double templateHeight)
        {
            //从文件取得图片对象，并使用流中嵌入的颜色管理信息   
            //System.Drawing.Image myImage = System.Drawing.Image.FromStream(fromFileStream, true);
            System.Drawing.Image myImage = System.Drawing.Image.FromFile(fromFileStream);
            //缩略图宽、高   
            System.Double newWidth = myImage.Width, newHeight = myImage.Height;
            //宽大于模版的横图   
            if (myImage.Width > myImage.Height || myImage.Width == myImage.Height)
            {
                if (myImage.Width > templateWidth)
                {
                    //宽按模版，高按比例缩放   
                    newWidth = templateWidth;
                    newHeight = myImage.Height * (newWidth / myImage.Width);
                }
            }
            //高大于模版的竖图   
            else
            {
                if (myImage.Height > templateHeight)
                {
                    //高按模版，宽按比例缩放   
                    newHeight = templateHeight;
                    newWidth = myImage.Width * (newHeight / myImage.Height);
                }
            }
            //取得图片大小   
            System.Drawing.Size mySize = new Size((int)newWidth, (int)newHeight);
            //新建一个bmp图片   
            System.Drawing.Image bitmap = new System.Drawing.Bitmap(mySize.Width, mySize.Height);
            //新建一个画板   
            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);
            //设置高质量插值法   
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            //设置高质量,低速度呈现平滑程度   
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            //清空一下画布   
            g.Clear(System.Drawing.Color.Transparent);
            //在指定位置画图   
            g.DrawImage(myImage, new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
            new System.Drawing.Rectangle(0, 0, myImage.Width, myImage.Height),
            System.Drawing.GraphicsUnit.Pixel);
            ///文字水印   
            //System.Drawing.Graphics G = System.Drawing.Graphics.FromImage(bitmap);
            //System.Drawing.Font f = new Font("宋体", 10);
            //System.Drawing.Brush b = new SolidBrush(Color.Black);
            //G.DrawString("myohmine", f, b, 10, 10);
            //G.Dispose();  
            ///图片水印   
            //System.Drawing.Image copyImage = System.Drawing.Image.FromFile(System.Web.HttpContext.Current.Server.MapPath("1.jpg"));
            //Graphics a = Graphics.FromImage(bitmap);
            //a.DrawImage(copyImage, new Rectangle(bitmap.Width - copyImage.Width, bitmap.Height - copyImage.Height, copyImage.Width, copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, GraphicsUnit.Pixel);
            //copyImage.Dispose();
            //a.Dispose();
            //copyImage.Dispose();  
            //保存缩略图   
            bitmap.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
            g.Dispose();
            myImage.Dispose();
            bitmap.Dispose();
        }
    }
}
